package netWork;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpClient {
    private Socket socket = null;

    public TcpClient(String serverIp, int serverPort) throws IOException {
        // 此处可以把这里的 ip 和 port 直接传给 socket 对象.
        // 由于 tcp 是有连接的. 因此 socket 里面就会保存好这俩信息.
        // 因此此处 TcpEchoClient 类就不必保存.
        socket = new Socket(serverIp, serverPort);
    }

    public void start() {
        System.out.println("客户端启动!");
        try (InputStream inputStream = socket.getInputStream();
             OutputStream outputStream = socket.getOutputStream()) {
            Scanner scannerConsole = new Scanner(System.in);
            Scanner scannerNetwork = new Scanner(inputStream);
            PrintWriter writer = new PrintWriter(outputStream);
            while (true) {
                // 这里的流程和 UDP 的客户端类似.
                // 1. 从控制台读取输入的字符串
                System.out.print("-> ");
                if (!scannerConsole.hasNext()) {
                    break;
                }
                String request = scannerConsole.next();
                // 2. 把请求发给服务器. 这里需要使用 println 来发送. 为了让发送的请求末尾带有 \n
                //    这里是和服务器的 scanner.next 呼应的.
                writer.println(request);
                // 通过这个 flush 主动刷新缓冲区, 却保数据真的发出去了.
                writer.flush();
                // 3. 从服务器读取响应. 这里也是和服务器返回响应的逻辑对应.
                String response = scannerNetwork.next();
                // 4. 把响应显示出来
                System.out.println(response);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws IOException {
        TcpClient client = new TcpClient("127.0.0.1", 9090);
        client.start();
    }
}